/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.operativa;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.admin.exception.SolicitudRespuestaException;
import co.gov.medellin.sdep.sisdep.admin.exception.PersonaException;
import co.gov.medellin.sdep.sisdep.admin.service.IPersonaService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.domain.SolicitudBaseController;
import co.gov.medellin.sdep.sisdep.gestion.exception.SolicitudException;
import co.gov.medellin.sdep.sisdep.model.Citacion;
import co.gov.medellin.sdep.sisdep.model.Persona;
import co.gov.medellin.sdep.sisdep.operativa.exception.CitacionException;
import co.gov.medellin.sdep.sisdep.operativa.exception.CitacionRuntimeException;
import co.gov.medellin.sdep.sisdep.operativa.service.ICitacionService;

/**
 * @author Usuario
 * 
 */
public class CitacionController extends SolicitudBaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public CitacionController() {
		this.citacionListModel = new ListDataModel();
	}

	/** bean para el manejo del formulario de busqueda Citacion */
	private Citacion citacionSearch = new Citacion();

	/** Objeto contenedor del listado de Citacion luego de una consulta. */
	private DataModel citacionListModel;

	/** bean para el manejo del formulario de creacion/edicion. Citacion */
	private Citacion citacion = new Citacion();

	/** instancia de servicio citacionService */
	private ICitacionService citacionService;
	
	ComparendoController comparendoController ;
	
	private Persona personaLocal = new Persona();
	
	/** instancia de servicio personaService */
	private IPersonaService personaService;
	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String initState() throws SolicitudException, SolicitudRespuestaException {
		Map params = getExternalContext().getRequestParameterMap();
		this.solicitudOrigenRedirectPage = (String) params.get("solicitudOrigenRedirectPage");
		this.solicitudDestinoRedirectPage = (String) params.get("solicitudDestinoRedirectPage");
		if(this.citacionSearch == null){
			this.citacion = new Citacion();
			this.citacionSearch = new Citacion();
		}
		this.citacion.setIdTipoDocumentoStr((String) params.get("idTipoIdentificacionStr"));
		this.citacion.setDocumentoPersona((String) params.get("identificacion"));
		this.citacionSearch.setIdTipoDocumentoStr((String) params.get("idTipoIdentificacionStr"));
		this.citacionSearch.setDocumentoPersona((String) params.get("identificacion"));
		return solicitudOrigenRedirectPage;
	}

	/**
	 * 
	 * @return String
	 */
	public String searchCitacionByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getCitacionService().load(1, 10,
					this.citacionSearch);
			this.citacionListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.citacionListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.citacionListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.CITACION_SEARCH_VIEW;
	}

	
	/**
	 * 
	 * @return String
	 */
	public String searchCitacionByDocumento() {
		String msg = "";
		try {
			List valores = null;
			citacionSearch.setIdTipoDocumento(new Long(citacionSearch.getIdTipoDocumentoStr()));
			valores = getCitacionService().loadByDocumento(1, 10,
					this.citacionSearch);
			this.citacionListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.citacionListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.citacionListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.CITACION_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.citacion.getId().longValue() == 0L) {
				citacion.setIdTipoDocumento(new Long(citacion.getIdTipoDocumentoStr()));
				citacion.setIdCitacionLugar(new Long(citacion.getIdCitacionLugarStr()));
				if(citacion.getValorMultaStr().equals("") || citacion.getValorMultaStr() == null)
					citacion.setValorMultaStr("0");
				citacion.setValorMulta(new Long(citacion.getValorMultaStr()));
				
				if(getCitacionService().verificarDocumento(citacion).equals("1")){									
					if(citacion.isAsisteChk())
						citacion.setAsiste("S");
					else
						citacion.setAsiste("N");
					if(citacion.isReincidenteChk())
						citacion.setReincidente("S");
					else
						citacion.setReincidente("N");
					if(citacion.isReincidenteChk())
						citacion.setPagoMulta("S");
					else
						citacion.setPagoMulta("N");				
					getCitacionService().insert(this.citacion);
					msg = AppConstants.SUCCESS_CREATE;
				}
				else{
					msg = "El Documento Ingresado no existe en el sistema, Por favor registre la persona";
					((MessageModalWindowController) getBean("messageController"))
					.setSuccessMessage("  " + msg, null, null);
					return AppConstants.CITACION_CREATE_VIEW;
				}
			}
		} catch (CitacionException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (CitacionRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Citaci\u00F3n " + msg, null, null);
		return AppConstants.CITACION_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.citacion.getId().longValue() != 0L) {
				citacion.setIdTipoDocumento(new Long(citacion.getIdTipoDocumentoStr()));
				citacion.setIdCitacionLugar(new Long(citacion.getIdCitacionLugarStr()));
				if(citacion.getValorMultaStr().equals("") || citacion.getValorMultaStr() == null)
					citacion.setValorMultaStr("0");
				citacion.setValorMulta(new Long(citacion.getValorMultaStr()));
				
				if(getCitacionService().verificarDocumento(citacion).equals("1")){							
					if(citacion.isAsisteChk())
						citacion.setAsiste("S");
					else
						citacion.setAsiste("N");
					if(citacion.isReincidenteChk())
						citacion.setReincidente("S");
					else
						citacion.setReincidente("N");
					if(citacion.isReincidenteChk())
						citacion.setPagoMulta("S");
					else
						citacion.setPagoMulta("N");								
					getCitacionService().update(this.citacion);
					msg = AppConstants.SUCCESS_UPDATE;
				}else{
					msg = "El Documento Ingresado no existe en el sistema, Por favor registre la persona";
					((MessageModalWindowController) getBean("messageController"))
					.setSuccessMessage("  " + msg, null, null);
					return AppConstants.CITACION_UPDATE_VIEW;
				}
			}
		} catch (CitacionException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (CitacionRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Citaci\u00F3n " + msg, null, null);
		return AppConstants.CITACION_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createCitacion() {
		String idTipoIdentificacion = getCitacion().getIdTipoDocumentoStr();
		String identificacion = getCitacion().getDocumentoPersona();
		citacion = new Citacion();
		citacion.setId(new Long(0L));
		citacion.setCodigo("");
		getCitacion().setIdTipoDocumentoStr(idTipoIdentificacion);
		getCitacion().setDocumentoPersona(identificacion);
		//citacion.setValor("");
		//citacion.setActivo("N");
		return AppConstants.CITACION_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateCitacion() {
		Map params = getExternalContext().getRequestParameterMap();
		String citacionDataIndex = (String) params
				.get("citacionDataIndex");
		this.citacion = (Citacion) ((List) this.citacionListModel
				.getWrappedData())
				.get(Integer.parseInt(citacionDataIndex));
		
		checkPersonaRegistrada();
		return AppConstants.CITACION_UPDATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String cancelCitacion() {
		return AppConstants.CITACION_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String cancelCitacionOpcion() {
		return getSolicitudDestinoRedirectPage();
	}

	/**
	 * 
	 * @return
	 */
	public String comparendoCitacion() {
		Map params = getExternalContext().getRequestParameterMap();
		String citacionDataIndex = (String) params
				.get("citacionDataIndex");
		this.citacion = (Citacion) ((List) this.citacionListModel
				.getWrappedData())
				.get(Integer.parseInt(citacionDataIndex));
							
		getComparendoController().comparendoSearch.setIdCitacion(citacion.getId());
		getComparendoController().comparendoSearch.setIdTipoDocumentoStr(citacion.getIdTipoDocumentoStr());
		getComparendoController().comparendoSearch.setDocumento(citacion.getDocumentoPersona());
		checkPersonaRegistrada();
		getComparendoController().setPersonaLocal(personaLocal);
		return AppConstants.COMPARENDO_SEARCH_VIEW;
	}
	
	public String checkPersonaRegistrada() {
		if ((citacion.getIdTipoDocumentoStr() != null && 
				!citacion.getIdTipoDocumentoStr().equals("") && 
				citacion.getIdTipoDocumentoStr().length() > 0)
				&& (citacion.getDocumentoPersona() != null && 
					!citacion.getDocumentoPersona().equals("") &&
					citacion.getDocumentoPersona().length() > 0)) {
			//Verificamos si la persona se encuentra registrada
			try {
				//Busqueda por tipo identificacion e identificacion
				getPersonaLocal().setIdentificacion(citacion.getDocumentoPersona());
				getPersonaLocal().setIdTipoIdentificacionStr(citacion.getIdTipoDocumentoStr());
				personaLocal = getPersonaService().findByRelated(getPersonaLocal());
			} catch (PersonaException e) {
				e.printStackTrace(System.err);
			}
		}
		if(null == personaLocal) {
			personaLocal = new Persona();
			personaLocal.setPrimerNombre("N/A");
			personaLocal.setSegundoNombre("N/A");
			personaLocal.setPrimerApellido("N/A");
			personaLocal.setSegundoApellido("N/A");
		}
		return "";
	}	
	
	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public Citacion getCitacionSearch() {
		return citacionSearch;
	}

	/**
	 * 
	 * @param citacionSearch
	 */
	public void setcitacionSearch(Citacion citacionSearch) {
		this.citacionSearch = citacionSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getcitacionListModel() {
		return citacionListModel;
	}

	/**
	 * 
	 * @param citacionListModel
	 */
	public void setcitacionListModel(DataModel citacionListModel) {
		this.citacionListModel = citacionListModel;
	}

	/**
	 * 
	 * @return
	 */
	public Citacion getCitacion() {
		return citacion;
	}

	/**
	 * 
	 * @param citacion
	 */
	public void setcitacion(Citacion citacion) {
		this.citacion = citacion;
	}

	/**
	 * obtencion del servicio citacionService
	 * 
	 * @return
	 */
	public ICitacionService getCitacionService() {
		return citacionService;
	}

	/**
	 * establecimiento del servicio citacionService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param citacionService
	 */
	public void setCitacionService(
			ICitacionService citacionService) {
		this.citacionService = citacionService;
	}


	public ComparendoController getComparendoController() {
		return comparendoController;
	}


	public void setComparendoController(ComparendoController comparendoController) {
		this.comparendoController = comparendoController;
	}
	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------


	public Persona getPersonaLocal() {
		return personaLocal;
	}


	public void setPersonaLocal(Persona personaLocal) {
		this.personaLocal = personaLocal;
	}


	public IPersonaService getPersonaService() {
		return personaService;
	}


	public void setPersonaService(IPersonaService personaService) {
		this.personaService = personaService;
	}

}
